// 箭头函数

// 一、定义函数的几种方式

// 1、方式一

console.log(sum1(1,2));

function sum1(x,y){
    return x+y
}

// 2、方式二

// console.log(sum2(1,2));//Uncaught ReferenceError: sum2 is not a function

let sum2=function(x,y){
    return x+y;
}

console.log(sum2(1,2));

// 3、方式三：箭头函数

let sum3=(x,y)=>{
    return x+y;
}

console.log(sum3(1,2));

// 当箭头函数没有参数或多个参数，必须用（）包括起来

// 不使用箭头函数
let x1=function(){
    return 1;
}

// 使用箭头函数

let x2=()=>{
    return 1;
}

// 当箭头函数的函数体只有一行语句，并且需要返回结果时，可以省略{}和return

let sum4=(x,y)=>x+y;

console.log(sum4(1,2));

// 当箭头函数的函数体有多行语句，必须用{}包裹起来，表示代码块。

let sum5=(x,y)=>{
    let result=x+y;
    return result;
}

console.log(sum5(1,5));

// 随堂作业
// 箭头函数写
let y1=function(y){
    return y;
}

let y=y=>y;

let z1=function(){
    let sum=0;
    for(let i=1;i<=3;i++){
        sum+=i;
    }
    return sum
}

let z=()=>{
    let sum=0;
    for(let i=0;i<=3;i++){
        sum+=i
    }
    return sum
}

// 二、this的本质

// 1.全局函数的this指向全局对象window

function text(){
    console.log(this);//this 指向window对象
}

text();

// 2.当函数作为对象的方法被调用时，this指向该对象，即谁调用函数this指向谁；

let arr=[1,2];
arr.say=function(){
    console.log(this);//this指向arr对象
}

arr.say();

let user={
    name:"xxxxxx",
    age:18,
    say:function(){
        console.log(this);//this指向user对象
    }
}

user.say();

// 3.匿名函数的this指向全局对象window

let user1={
    name:"xxxxxx",
    age:18,
    say:function(){
        setInterval(function(){
            console.log(this);//this指向window对象
        },1000)
    }
}

// user1.say();

// 4. 箭头函数的this指向的是定义时的this对象，而不是执行时的this对象，

// 问题：如何获取user3对象的name？

// 方法一：不使用箭头函数，通过闭包方式实现

let user2={
    name:"xxxxxx",
    age:18,
    say:function(){
        setInterval(function(){
           console.log(this.name);//空
        },1000)
    }
}

// user2.say();
let user3={
    name:"xxxxxx",
    age:18,
    say:function(){
        console.log(this.name);//this 指向user3对象
        let arr=this
        setInterval(function(){
           console.log(arr.name);// xxxxxx
        },1000)
    }
}

// user3.say();

// 方法二：使用箭头函数

let user4={
    name:"xxxxxx",
    age:18,
    say:function(){
        setInterval(()=>{
            console.log(this.name);//xxxxxx
        },1000)
    }
}

// user4.say();

// 箭头函数虽然好用，但不能滥用！

// 错误示范

let user5={
    name:"zzzzzz",
    age:18,
    say:()=>{
        console.log(this.name); //undefined
    }
}

user5.say()